﻿using System.Collections.Concurrent;

namespace TrackSystem.IO.Formula
{
    // public class MathDefine
    // {
    //     public static Dictionary<OperatorType, Func<double[], Guid, double>> OpFunc = new ()
    //     {
    //         [OperatorType.DIST] = (num, _) => LonLatTools.GetDirectDistance(num[3], num[2], num[1], num[0]),
    //         [OperatorType.AZIM] = (num, _) => LonLatTools.GetAzimuth(num[3], num[2], num[1], num[0]),
    //
    //         [OperatorType.COLON] = (num, _) => num[2] != 0 ? num[1] : num[0],
    //
    //         [OperatorType.POW] = (num, _) => Math.Pow(num[1], num[0]),
    //         [OperatorType.FIX] = (num, _) => num[0],
    //
    //         [OperatorType.MUL] = (num, _) => num[1]*num[0],
    //         [OperatorType.DIV] = (num, _) => {
    //             if (num[0] < 0)
    //             {
    //                 throw new Exception($"Pow Operator blow zero {num[1]}");
    //             }
    //             return num[1] / num[0];
    //             },
    //
    //         [OperatorType.MOD] = (num, _) => (int)num[1] % (int)num[0],
    //         [OperatorType.ADD] = (num, _) => num[1] + num[0],
    //         [OperatorType.SUB] = (num, _) => num[1] - num[0],
    //
    //         [OperatorType.AND] = (num, _) => num[0] != 0 && num[1] != 0 ? 1 : 0,
    //         [OperatorType.OR] = (num, _) => num[0] != 0 || num[1] != 0 ? 1 : 0,
    //
    //         [OperatorType.ET] = (num, _) => num[0] == num[1] ? 1 : 0,
    //         [OperatorType.UT] = (num, _) => num[0] != num[1] ? 1 : 0,
    //         [OperatorType.LT] = (num, _) => num[1] < num[0] ? 1 : 0,
    //         [OperatorType.GT] = (num, _) => num[1] > num[0] ? 1 : 0,
    //         [OperatorType.LE] = (num, _) => num[1] <= num[0] ? 1 : 0,
    //         [OperatorType.GE] = (num, _) => num[1] >= num[0] ? 1 : 0,
    //
    //         [OperatorType.PS] = (num, _) => num[0], 
    //         [OperatorType.NS] = (num, _) => -num[0], 
    //         [OperatorType.TAN] = (num, _) => Math.Tan(num[0]),
    //         [OperatorType.ATAN] = (num, _) => Math.Atan(num[0]),
    //         [OperatorType.SIN] = (num, _) => Math.Sin(num[0]),
    //         [OperatorType.ASIN] = (num, _) => Math.Asin(num[0]),
    //         [OperatorType.COS] = (num, _) => Math.Cos(num[0]),
    //         [OperatorType.ACOS] = (num, _) => Math.Acos(num[0]),
    //         [OperatorType.ABS] = (num, _) => Math.Abs(num[0]),
    //
    //         [OperatorType.SQRT] = (num, _) =>
    //         {
    //             if (num[0] < 0)
    //             {
    //                 throw new Exception($"SQRT Operator blow zero {num[0]}");
    //             }
    //             return Math.Sqrt(num[0]);
    //         },
    //         [OperatorType.LG] = (num, _) =>
    //         {
    //             if (num[0] < 0)
    //             {
    //                 throw new Exception($"Lg Operator blow zero {num[0]}");
    //             }
    //             return Math.Log10(num[0]);
    //         },
    //         [OperatorType.RAND] = (num, _) => num[0]*ClacuationFormula.rand.NextDouble(),
    //         [OperatorType.INT] = (num, _) => (int)num[0],
    //         [OperatorType.QUESTION] = (num, _) => num[0] > 0 ? 1 : 0,
    //         [OperatorType.NOT] = (num, _) => num[0] == 0 ? 1 : 0,
    //
    //         [OperatorType.RAMP] = (num, id) => FormulaTools.Instance.Step(id, num[1], num[0]),
    //         [OperatorType.ANGLE] = (num, id) => FormulaTools.Instance.Step(id, num[1], num[0]),
    //     };
    // }

    public class OperatorDefine
    {
        /// <summary>
        /// 识别号
        /// </summary>
        public Guid Id { get; set; } = Guid.Empty;

        /// <summary>
        /// 操作符
        /// </summary>
        public OperatorType OpType { get; set; } = OperatorType.NONE;
    
        /// <summary>
        /// 关键字
        /// </summary>
        public string[] Keywords = new string[1];

        /// <summary>
        /// 操作函数
        /// </summary>
        public Func<OperandDef[], Guid, OperandDef>? func { get; set; }
    }
}
